﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmConsultaDeExplosiones.xaml
    /// </summary>
    public partial class FrmConsultaDeExplosiones : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtTituloTallasReporte;//FJRF - Usamos este DataTable para hacer consultas de los titulos de las tallas
        DataTable DtImprimir;
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        DataTable DtConsultaExplosiones;//FJRF - Usamos este DataTable para hacer consultas 
        DataTable DtConsultaPedidos;//FJRF - Usamos este DataTable para hacer consultas 
        DataTable DtConsultaReferencias;//FJRF - Usamos este DataTable para hacer consultas 

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto
        String StrCodigoPrimerColorReferencia;

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        
        Boolean BooOcultarColumnasGridReferencias;//FJRF - Para controlar el ver o no ver columnas del grid de referencias
        String StrNumeroDeExplosionSeleccionada = "", StrNumeroDePedidos = "";

        #endregion

        #region FJRF - Objetos del formulario

        public FrmConsultaDeExplosiones()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            StrConsulta = "SELECT NROEXP_EEX AS NRO,  FECEXP_EEX AS FECHA,  CODGRP_EEX AS GRUPO,  CODSUB_EEX AS SUBGRUPO,  SUSTIT_EEX AS SUSTITUTO,  CONCEP_EEX AS CONCEPTO FROM ENCEXPP ORDER BY NROEXP_EEX DESC ";//FJRF - Armamos la consulta
            DtConsultaExplosiones = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
            DtgExplosiones.ItemsSource = DtConsultaExplosiones.DefaultView;//FJRF - Cargamos los datos en el grid
        }
        private void DtgExplosiones_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgPedidos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgExplosiones_KeyUp(object sender, KeyEventArgs e)
        {
            String StrNumeroDeExplosion = "";//FJRF - Para guardar el numero de la explosion
            if (DtgExplosiones.SelectedItem == null)//FJRF - Si no hay explosion seleccionados hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else//FJRF - Si si hay datos hacemos lo siguiente
            {
                DataRowView dr = DtgExplosiones.SelectedItem as DataRowView;//FJRF - Creamos un DataRowView con el item seleccionado
                DataRow dr1 = dr.Row;//FJRF - Cargamos las filas que tenga

                StrNumeroDeExplosion = dr1.ItemArray[0].ToString();//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                PttV_ConsultarPedidos(StrNumeroDeExplosion);//FJRF - Buscamos los pedidos enviando el numero de la explosion
            }
        }
        private void DtgExplosiones_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            String StrNumeroDeExplosion = "";//FJRF - Para guardar el numero de la explosion
            if (DtgExplosiones.SelectedItem == null)//FJRF - Si no hay explosion seleccionados hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else//FJRF - Si si hay datos hacemos lo siguiente
            {
                DataRowView dr = DtgExplosiones.SelectedItem as DataRowView;//FJRF - Creamos un DataRowView con el item seleccionado
                DataRow dr1 = dr.Row;//FJRF - Cargamos las filas que tenga

                StrNumeroDeExplosion = dr1.ItemArray[0].ToString();//FJRF - Traemos los datos seleccionados en las columnas que se necesitan
                PttV_ConsultarPedidos(StrNumeroDeExplosion);//FJRF - Buscamos los pedidos enviando el numero de la explosion
            }
        }
        private void LblTituloGridReferencias_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            PttV_OcualtarColumas();//FJRF - Ocultamos las columas extras que tiene el grid
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        #endregion

        #region FJRF - Funciones y procedimientos
        protected void PttV_OcualtarColumas()
        {
            int IntOcultarColumnasDesdeLaPosicion = 23;//FJRF - Le decimos las sistema desde que posicion ocultaresmos las columnas del grid de referencias
            if (DtgReferencias.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
            {
                if (BooOcultarColumnasGridReferencias == true)//FJRF - Si el usuario dice que las ocultemos hacemos lo siguiente
                {
                    foreach (var ColumnaGrid in DtgReferencias.Columns)//FJRF - Recorremos el grid
                    {
                        if (ColumnaGrid.DisplayIndex > IntOcultarColumnasDesdeLaPosicion)
                        {
                            DtgReferencias.Columns[ColumnaGrid.DisplayIndex].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columna
                        }
                    }
                    BooOcultarColumnasGridReferencias = false;
                }
                else//FJRF - Si el usuario dice que no las ocultemos hacemos lo siguiente
                {
                    foreach (var ColumnaGrid in DtgReferencias.Columns)//FJRF - Recorremos el grid
                    {
                        if (ColumnaGrid.DisplayIndex > IntOcultarColumnasDesdeLaPosicion)
                        {
                            DtgReferencias.Columns[ColumnaGrid.DisplayIndex].Visibility = Visibility.Visible;//FJRF - Ponemos visible la columnas
                        }
                    }
                    BooOcultarColumnasGridReferencias = true;
                }
            }
        }

        protected void PttV_DarFormatoColumnas()
        {
            if (DtgReferencias.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
            {
                foreach (var ColumnaGrid in DtgReferencias.Columns)//FJRF - Recorremos el grid
                {
                    string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
                    strNombreColumna = DtgReferencias.Columns[ColumnaGrid.DisplayIndex].Header.ToString();//FJRF - Extraemos el titulo que tenga la columna

                    #region FJRF - Damos formato a las columnas antes de quitarlas
                    if (strNombreColumna == "TOTR" || strNombreColumna == "TOTAL")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
                    {
                        Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                        MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                        (ColumnaGrid as DataGridTextColumn).Binding.StringFormat = "{0:##,0;-##,0;  }";//FJRF - Enviamos el formato a la celda pero dejando un blanco si no tiene cero
                        (ColumnaGrid as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
                    }
                    #endregion
                }
            }
        }
        protected void PttV_ConsultarPedidos(String StrExplosion)
        {
            StrConsulta = "SELECT DISTINCT NROPED_DEX AS PEDIDO, FECPED_EPC AS FECHA ";//FJRF - Los campos con los que trabajaremos
            StrConsulta = StrConsulta + "FROM DETEXPP, ENCPPCP ";//FJRF - Las tablas que contienen los campos
            StrConsulta = StrConsulta + "WHERE NROEXP_DEX = '" + StrExplosion + "' AND CODCLI_EPC = SUBSTR(NROPED_DEX,1,3) AND NROPED_EPC = TO_NUMBER(SUBSTR(NROPED_DEX,4,4)) ";//FJRF - Condicionamos la busqueda de los datos 
            StrConsulta = StrConsulta + "ORDER BY NROPED_DEX";//FJRF - Ordenamos los datos encontrados

            DtConsultaPedidos = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
            DtgPedidos.ItemsSource = DtConsultaPedidos.DefaultView;//FJRF - Asignamos los datos encontrados

            EjecutarSp_INFCONSPEDIDOSEXPLOSION(StrExplosion);//FJRF - Ejecutamos el Sp que trae la consulta del grid de abajo lado derecho
        }
        private void EjecutarSp_INFCONSPEDIDOSEXPLOSION(string strNumeroExprosion)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                StrNumeroDeExplosionSeleccionada = strNumeroExprosion;//FJRF - Cargamos en una varible global del formulario el numero de explosion para q pueda ser manipilada en otro lado

                #region FJRF - Ejecutamos el Sp principal
                MDOgeneral.spComando.CommandText = "SP_INFCONSPEDIDOSEXPLOSION";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pnu_nroexp", Oracle.DataAccess.Client.OracleDbType.Int32).Value = Int32.Parse(strNumeroExprosion);

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
                #endregion

                #region FJRF - Buscamos el tallaje y lo asiganamos en variables
                String StrTallaje = "";//FJRF - Varible que contendra el codigo de tallaje que se esta usando
                DtConsulta = MdoGeneral.consulta("SELECT CODTAL_TLE FROM TMPLISEXIP GROUP BY CODTAL_TLE");//FJRF - Buscamos los datos

                StrTallaje = DtConsulta.Rows[0][0].ToString();//FJRF - Extraemos el tallaje
                //MdoGeneral.CargarTitulosTallasEnVariables(StrTallaje);//FJRF - Cargamos los tallajes en variables 
                #endregion

                #region FJRF - Consultamos los datos retornados por el sp
                StrConsulta = "SELECT ";//FJRF - Seleccionamos
                //FJRF - PRIMEROS DATOS ANTES DE LAS TALLAS
                StrConsulta = StrConsulta + "(CODREF_TLE || CODCOL_TLE) AS CODIGO,  NOMREF_TLE AS REFERENCIA,  NOMCOL_TLE AS COLOR,  TOTAL_TLE AS TOTAL,  ";//FJRF - Los campos con los que trabajaremos
                //FJRF - TALLAS INICIO
                StrConsulta = StrConsulta + "T1_TLE AS T1,  T2_TLE AS T2,  T3_TLE AS T3,  T4_TLE AS T4,  T5_TLE AS T5,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T6_TLE AS T6,  T7_TLE AS T7,  T8_TLE AS T8,  T9_TLE AS T9,  T10_TLE AS T10, ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T11_TLE AS T11,  T12_TLE AS T12,  T13_TLE AS T13,  T14_TLE AS T14,  T15_TLE AS T15,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T16_TLE AS T16,  T17_TLE AS T17,  T18_TLE AS T18,  T19_TLE AS T19,  T20_TLE AS T20 ";//FJRF - Los campos con los que trabajaremos

                //FJRF - OTROS DATOS
                StrConsulta = StrConsulta + ", CODTAL_TLE AS TAL, TOTR_TLE AS TOTR, CODLIN_TLE AS CODLIN,  NOMLIN_TLE AS LINEA, CLSREF_TLE AS CLSREF,  PREREF_TLE AS PREREF,  TOTCOS_TLE AS TOTCOS,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "CODMAR_TLE AS CODMAR,  NOMMAR_TLE AS NOMMAR,  POSBOD_TLE AS POSBOD,  COSREF_TLE AS COSREF,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "TOTCANLIN_TLE AS TOTCANLIN,  TOTCOSLIN_TLE AS TOTCOSLIN,  TOTPRELIN_TLE AS TOTPRELIN,  TOTPRE_TLE AS TOTPRE,  TOTREF_TLE AS TOTREF ";//FJRF - Los campos con los que trabajaremos
                //TABLA
                StrConsulta = StrConsulta + "FROM TMPLISEXIP ";//FJRF - Las tablas que contienen los campos
                //FJRF - ORDENAMIENTO
                StrConsulta = StrConsulta + "ORDER BY CODREF_TLE, CODCOL_TLE ";//FJRF - Ordenamos los datos encontrados

                DtConsultaReferencias = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
                DtgReferencias.ItemsSource = DtConsultaReferencias.DefaultView;//FJRF - Asignamos los datos encontrados
                #endregion

                MdoGeneral.ModificarTallasTituloGrid(DtgReferencias, StrTallaje, 4);//FJRF - Modificamos el titulo de las tallas

                #region FJRF - Realizamos procesos especiales al grid despues de cargado los datos
                DtgReferencias.FrozenColumnCount = 5;//FJRF - Inmovilizamos las columnas

                BooOcultarColumnasGridReferencias = true;//FJRF - Decimos que oculte siempre las columnas asignadas por defecto
                PttV_OcualtarColumas();//FJRF - Ocultamos las columas extras que tiene el grid
                PttV_DarFormatoColumnas();//FJRF - Damos formato a las columnas
                #endregion
            }
            catch (Exception ex) { throw ex; }
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {
                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptConsultaDeExplosiones.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir
                    if (DtConsultaReferencias == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = DtConsultaReferencias.Copy();//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport
                    CargarTituloTallasReporte();//FJRF - Cargamos los nuevos titulos de las tallas

                    DsImprimir = new DataSet("dsConsultaDeExplosiones");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe
                    DsImprimir.Tables.Add(DtTituloTallasReporte.Copy());//Titulo de tallas

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }

        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrExplosion", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrPedidos", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "CONSULTA DE EXPLOSIONES";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            StrNumeroDePedidos = "";//FJRF - Limpiamos los pedidos anteriores
            for (int IntFilaActual = 0; IntFilaActual < DtConsultaPedidos.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrNumeroDePedidos = StrNumeroDePedidos + " [ " + DtConsultaPedidos.Rows[IntFilaActual][0].ToString() + " ] ";//FJRF - Asignamos los pedidos
            }

            drEncabezadoYParametros["StrExplosion"] = StrNumeroDeExplosionSeleccionada;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrPedidos"] = StrNumeroDePedidos.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
        private void CargarTituloTallasReporte()
        {
            #region FJRF - CreamosLasColumnasDelosTitulos
            DtTituloTallasReporte = new DataTable("DtTituloTallasReporte");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS TITULOS DE LAS COLUMNAS
            DtTituloTallasReporte.Columns.Add("T1", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T2", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T3", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T4", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T5", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T6", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T7", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T8", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T9", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T10", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa

            DtTituloTallasReporte.Columns.Add("T11", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T12", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T13", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T14", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T15", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T16", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T17", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T18", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T19", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T20", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drTituloTallasReporte;//FJRF - Creamos un manejador de filas para el DataTable actual

            drTituloTallasReporte = DtTituloTallasReporte.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drTituloTallasReporte["T1"] = MDOgeneral.StrNuevoTituloTalla1;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T2"] = MDOgeneral.StrNuevoTituloTalla2;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T3"] = MDOgeneral.StrNuevoTituloTalla3;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T4"] = MDOgeneral.StrNuevoTituloTalla4;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T5"] = MDOgeneral.StrNuevoTituloTalla5;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T6"] = MDOgeneral.StrNuevoTituloTalla6;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T7"] = MDOgeneral.StrNuevoTituloTalla7;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T8"] = MDOgeneral.StrNuevoTituloTalla8;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T9"] = MDOgeneral.StrNuevoTituloTalla9;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T10"] = MDOgeneral.StrNuevoTituloTalla10;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drTituloTallasReporte["T11"] = MDOgeneral.StrNuevoTituloTalla11;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T12"] = MDOgeneral.StrNuevoTituloTalla12;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T13"] = MDOgeneral.StrNuevoTituloTalla13;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T14"] = MDOgeneral.StrNuevoTituloTalla14;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T15"] = MDOgeneral.StrNuevoTituloTalla15;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T16"] = MDOgeneral.StrNuevoTituloTalla16;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T17"] = MDOgeneral.StrNuevoTituloTalla17;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T18"] = MDOgeneral.StrNuevoTituloTalla18;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T19"] = MDOgeneral.StrNuevoTituloTalla19;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T20"] = MDOgeneral.StrNuevoTituloTalla20;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtTituloTallasReporte.Rows.Add(drTituloTallasReporte);//FJRF - Agregamos a la tabla el registro creado
            DtTituloTallasReporte.TableName = "DtTituloTallasReporte";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
        private void BtnImprimirExplosion_Click(object sender, RoutedEventArgs e)
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptExplosiondeMateriales.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir

                    StrConsulta = "SELECT CODPRV_MEX AS CODPRV_TMP,  CODMAT_MEX AS CODMAT_TMP,  CODCOL_MEX AS CODCOL_TMP, ";
                    StrConsulta = StrConsulta + "NOMPRV_PRV AS NOMPRV_TMP, NOMMAT_MAT AS NOMMAT_TMP, NOMCOL_COL AS NOMCOL_TMP,  CANREQ_MEX AS CANREQ_TMP, ";
                    StrConsulta = StrConsulta + "CANEXI_MEX AS CANEXI_TMP,  CANRES_MEX AS CANRES_TMP,  CANPED_MEX AS CANPED_TMP,  '' AS TIPMAT_TMP, '' AS COSMAT_TMP, CANPEN_MEX AS CANPEN_TMP ";
                    StrConsulta = StrConsulta + "FROM MATEXPP, MAEPRVP, MAEMAT, MAECOLP ";
                    StrConsulta = StrConsulta + "WHERE CODPRV_PRV = CODPRV_MEX ";
                    StrConsulta = StrConsulta + "AND CODMAT_MAT = CODMAT_MEX ";
                    StrConsulta = StrConsulta + "AND CODCOL_COL = CODCOL_MEX ";
                    StrConsulta = StrConsulta + "AND NROEXP_MEX = '" + StrNumeroDeExplosionSeleccionada + "' ORDER BY CODPRV_TMP, CODMAT_TMP, CODCOL_TMP";

                    DtConsulta = MdoGeneral.consulta(StrConsulta);

                    if (DtConsulta == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = DtConsulta;//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresionExplosion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                    DsImprimir = new DataSet("dsExplosiondeMateriales");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresionExplosion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrGrupo", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrSubGrupo", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrConSustituto", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrConcepto", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrExplosion", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrPedidos", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "EXPLOSIÓN DE MATERIALES";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            String StrGrupo = "", StrSubGrupo = "", StrConSustituto = "", StrConcepto = "";
            StrConsulta = "SELECT NROEXP_EEX,  FECEXP_EEX,  CODGRP_EEX,  CODSUB_EEX,  SUSTIT_EEX,  CONCEP_EEX FROM ENCEXPP WHERE NROEXP_EEX = '" + StrNumeroDeExplosionSeleccionada + "' ";
            DtConsulta = MdoGeneral.consulta(StrConsulta);

            if (DtConsulta.Rows.Count > 0)
            {
                StrGrupo = DtConsulta.Rows[0]["CODGRP_EEX"].ToString();
                StrSubGrupo = DtConsulta.Rows[0]["CODSUB_EEX"].ToString();
                StrConSustituto = DtConsulta.Rows[0]["SUSTIT_EEX"].ToString();
                StrConcepto = DtConsulta.Rows[0]["CONCEP_EEX"].ToString();
            }

            drEncabezadoYParametros["StrGrupo"] = StrGrupo;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrSubGrupo"] = StrSubGrupo;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrConSustituto"] = StrConSustituto;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrConcepto"] = StrConcepto;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrExplosion"] = StrNumeroDeExplosionSeleccionada;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            StrNumeroDePedidos = "";//FJRF - Limpiamos los pedidos anteriores
            for (int IntFilaActual = 0; IntFilaActual < DtConsultaPedidos.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrNumeroDePedidos = StrNumeroDePedidos + " [ " + DtConsultaPedidos.Rows[IntFilaActual][0].ToString() + " ] ";//FJRF - Asignamos los pedidos
            }

            drEncabezadoYParametros["StrPedidos"] = StrNumeroDePedidos;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
        #endregion

    }
}
